/*
 * Copyright © 2019 Cask Data, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

import React from 'react';
import PropTypes from 'prop-types';
import CodeEditor, { IBaseCodeEditorProps } from 'components/shared/CodeEditor';

const prettyPrint = (unformattedValue: string) => {
  let v = unformattedValue;
  try {
    v = JSON.parse(v);
  } catch (e) {
    return unformattedValue;
  }
  return JSON.stringify(v, null, 2);
};
function JSONEditor({ value, onChange, disabled, ...restProps }: IBaseCodeEditorProps) {
  const codeValue = disabled ? prettyPrint(value) : value;

  return (
    <CodeEditor
      {...restProps}
      value={codeValue}
      onChange={onChange}
      activeLineMarker={false}
      showPrettyPrintButton={true}
      prettyPrintFunction={prettyPrint}
    />
  );
}

(JSONEditor as any).propTypes = {
  mode: PropTypes.string,
  value: PropTypes.string,
  onChange: PropTypes.func,
  rows: PropTypes.number,
  disabled: PropTypes.bool,
  classes: PropTypes.object,
};

export default JSONEditor;
